// push() - 重写了数组原型，和原型上对应的操作方法
const proto = Array.prototype

const newPrototype = Object.create(proto)

var arr1 = []
var arr2 = []
var arr3 = []

arr1.__proto__ = newPrototype
arr2.__proto__ = newPrototype
arr3.__proto__ = newPrototype

var arrayMethods = ['push', 'pop', 'shift', 'reverse' ]
arrayMethods.forEach(item => {
  Object.defineProperty(newPrototype, item, {
    value: function (...args) { // 函数中有 this,特别对于模拟原生方法的这种情况。最好不要写匿名函数。因为匿名函数中是没有 this 的
      console.log('rewrite Array prototype')
      const result = proto[item].call(this, ...args)
      // notify()
      return result
    }
  })
})
arr1.push(0)
arr2.pop(0)
arr3.shift(0)




// 通过 Object.create 创建的对象，原型为参数对象。是两个完全不干扰的对象。修改另一个不会影响到前面那个
var a = {re: 'apple'}
const b = Object.create(a)
b.re = 'orange'

console.log(a)
console.log(b)

console.log(...[1, 2, 3])





console.log([1, 2, 3].push('4'))